<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8" />
        <meta http-equiv="X-UA-Compatible" content="IE=edge" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <title>this关键字</title>
    </head>
    <body>
        <script>
            // 全局执行上下文中this指向window
            // console.log(this);

            // 局部执行上下文
            // 普通函数中this指向window
            // function f1(a, b) {
            //     console.log("f1的this：", this);
            //     console.log(a, b);
            // }
            // f1();

            // eval函数执行上下文
            // eval函数中this指向window
            // eval("console.log(this)");

            // 对象的方法中this指向当前对象
            // this所在的上下文如果不是当前对象的方法，那么this同样指向window
            // let obj = {
            //     show: () => {
            //         console.log(this);
            //     },
            // };
            // obj.show();

            // 在事件的回调函数中this指向事件源对象

            // this指向改变的方法：
            // call：调用函数，其中第一个参数表示this的指向，
            // 第二个及后面的参数就是该函数的实参
            // f1.call({},100,200);

            // apply：和call功能一样，其中第一个参数表示this的指向，
            // 第二个参数是一个数组，存放该函数的所有实参
            // f1.apply({name:"张飞"},[100,200])

            // bind：先将函数的this指向重新绑定，然后返回该函数
            // 接着执行该函数
            // let func = f1.bind({name:"关羽"});
            // func(100,200);
            // f1.bind({ name: "关羽" })(100, 200);

            // 箭头函数的上下文没有this指向，其中的this和外部上下文指向是相同的
            //5.
            // if ("a" in window) {
            //     var a = 10;
                
            // }
            // alert(a);

            //6.
            // var a = (b = 3);
            // (function () {
            //     var a = (b = 5);
            // })();
            // console.log(a);
            // console.log(b);
            // //7.
            // var foo = "A";
            // console.log(foo);

            // var foo = function () {
            //     console.log("B");
            // };
            // console.log(foo);
            // foo();

            // function foo() {
            //     console.log("C");
            // }
            // console.log(foo);
            // foo();

            // //8.
            var a = 1;
            function b() {
                console.log(a);
                a = 2;
                console.log(a);
                var a = 3;
                console.log(a);
            }
            console.log(a);
            b();
            console.log(a);
        </script>
    </body>
</html>
